#pragma once
#include "Socket.hpp"
#include <cstdio>


static void service(int sock,std::string clientip,uint16_t clientport)
{
    char buffer[1024];
    while(true)
    {
        ssize_t s=read(sock,buffer,sizeof(buffer)-1);
        if(s>0)
        {
            buffer[s] = 0; //将发过来的数据当做字符串
            std::cout << clientip << ":" << clientport << "# " << buffer << std::endl;
        }
        else if(s==0)
        {
            logMessage(NORMAL, "%s:%d shutdown, me too!", clientip.c_str(), clientport);
            break;
        }
        else
        {
            logMessage(ERROR, "read error:%d,%s", errno, strerror(errno));
            break;
        }

        write(sock,buffer,strlen(buffer));
    }
}
class TcpServer
{
public:
    TcpServer(uint16_t port, std::string ip=""):listensock(-1), _port(port), _ip(ip)
    {}

    void initServer()
    {
        listensock=Sock::Socket();
        Sock::Bind(listensock,_port,_ip);
        Sock::Listen(listensock);
    }
    void start()
    {
         while(true)
         {
            sleep(1);
            
            // fd(李四，王五等提供服务的服务员) vs _sock(张三 --- 获取新连接)
            int servicesock =Sock::Accept(listensock,&_ip,&_port);
            pid_t pid=fork();
            if(pid==0)
            {
                
                close(listensock);
                service(servicesock,_ip,_port);
                exit(0); // 僵尸状态

            }
            close(servicesock); // 如果父进程关闭servicesock，会不会影响子进程？？下节课
            // 父进程
            // waitpid(); // 


         }       
    }
    ~TcpServer()
    {
        ;
    }
private:
    uint16_t _port;
    std::string _ip;
    int listensock;

};